#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/*
https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/03-Supported-devices/02-Customization
*/

#include "main.h"
#include "stdint.h"

/*configUSE_PREEMPTION 
如果希望使用抢占式 RTOS 调度器，请将其设置为 1；如果希望使用协同式 RTOS 调度器，请将其设置为 0。
*/
#define configUSE_PREEMPTION                                        1

/* 一种是通用方法0，另一种是移植特定方法1。 default 0*/
#define configUSE_PORT_OPTIMISED_TASK_SELECTION                     0

/*如果希望使用低功耗无滴答模式，请将 default:0 
configUSE_TICKLESS_IDLE
 设置为 1； 如果希望保持滴答中断始终运行，请将其设置为 0。并未针对 所有 FreeRTOS 移植提供低功耗无滴答实现。*/
#define configUSE_TICKLESS_IDLE                                     0

/*cpu时钟   */
#define configCPU_CLOCK_HZ                                          SystemCoreClock

/*仅适用于 ARM Cortex-M 移植的可选参数。

默认情况下，ARM Cortex-M 移植使用 Cortex-M SysTick 定时器生成 RTOS 滴答中断。大多数 Cortex-M MCU 以与其本身相同的频率运行 SysTick 定时器。在这种情况下， 无需 
configSYSTICK_CLOCK_HZ
，应让其保持未定义状态。如果 SysTick 定时器的时钟频率与 MCU 核心的频率不同，则应将 
configCPU_CLOCK_HZ
 设置为 MCU 时钟频率（正常情况下），并将 
configSYSTICK_CLOCK_HZ
 设置为 SysTick 时钟频率。*/
/*SysTick 时钟频率 不设置=cpuclk,设置后变成了HCLK/8*/
#define configSYSTICK_CLOCK_HZ                                      (configCPU_CLOCK_HZ/8)
/*或者不定义*/
//#define configSYSTICK_CLOCK_HZ                                       

/*RTOS 滴答中断的频率。*/
#define configTICK_RATE_HZ                                          (1000l)

/*应用程序任务可用的优先级数量*/
#define configMAX_PRIORITIES                                        (10)

/* 空闲任务使用的堆栈大小 4字节单位 128*4字节*/
#define configMINIMAL_STACK_SIZE                                    (128)

/*描述性名称的最大允许长度*/
#define configMAX_TASK_NAME_LEN                                     (16)

/*16位模式，stm32是32位模式 设置为0*/
#define configUSE_16_BIT_TICKS                                      0

/*空闲任务 将 
configIDLE_SHOULD_YIELD
 设置为 0 可防止空闲任务 在其时间切片结束前让出处理时间。
 这可确保所有处于空闲优先级的任务 （如果没有任务被抢占）都分配到相同的处理时间， 
 但代价是空闲任务 会占用更多的总处理时间。 default:1*/
#define configIDLE_SHOULD_YIELD                                     0

/*如果在构建中包含直达任务通知，每项任务会额外消耗 8 字节的 RAM default:1*/
#define configUSE_TASK_NOTIFICATIONS                                1

/*每项 RTOS 任务都有一个任务通知数组。 
configTASK_NOTIFICATION_ARRAY_ENTRIES
 可用于设置数组中的索引数。 
在 FreeRTOS V10.4.0 之前，任务只有一个通知值，没有通知值数组， 因此，出于向后兼容考虑，如果 
configTASK_NOTIFICATION_ARRAY_ENTRIES
 未定义，defalut: 1。*/
#define configTASK_NOTIFICATION_ARRAY_ENTRIES                       1

/*互斥锁 mutex*/
#define configUSE_MUTEXES                                           1

/*递归互斥锁*/
#define configUSE_RECURSIVE_MUTEXES                                 1

/*信号量 default:0*/
#define configUSE_COUNTING_SEMAPHORES                               1

/*替代”队列函数 过期 default :0*/
#define configUSE_ALTERNATIVE_API                                   0 /* Deprecated! */

/*注册的队列和信号量的最大数量 default 0*/
#define configQUEUE_REGISTRY_SIZE                                   8

/*队列集功能 default 0*/
#define configUSE_QUEUE_SETS                                        0

/*默认情况下（如果未定义 
configUSE_TIME_SLICING
，或者 
configUSE_TIME_SLICING
 定义为 1），FreeRTOS 使用带时间切片的抢占式优先级调度。 这意味着 RTOS 调度器将始终运行优先级最高且处于就绪状态的任务， 并在每个 RTOS 滴答中断时在优先级相同的任务之间 切换。如果 
configUSE_TIME_SLICING
 设置为 0，则 RTOS 调度器 仍会运行优先级最高且处于就绪状态的任务，但不会 因为发生滴答中断而在优先级相同的任务之间切换。
 default:1 */
#define configUSE_TIME_SLICING                                      1

/* Newlib default:0*/
#define configUSE_NEWLIB_REENTRANT                                  0

/*是否兼容8.0以前的API名称 default:1*/
#define configENABLE_BACKWARD_COMPATIBILITY                         0

/*设置每项任务的线程本地存储数组中的索引数。default 0*/
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS                     0

/* MiniListItem_t
 用于 FreeRTOS 列表中的开始和结束标记节点，而 
ListItem_t
 则用于 FreeRTOS 列表中的所有其他节点。
configUSE_MINI_LIST_ITEM
 设置为 0 时，
MiniListItem_t
 和 
ListItem_t
 保持一致。
configUSE_MINI_LIST_ITEM
 设置为 1 时，
MiniListItem_t
 包含的字段 比 
ListItem_t
 少 3 个，这样可以节省一些 RAM，但代价是可能违反某些编译器用于优化时所依赖的 严格别名规则。如果未定义，
configUSE_MINI_LIST_ITEM
 默认为 1， 以实现向后兼容。
 defalut:1*/
#define configUSE_MINI_LIST_ITEM                                    1

/*堆栈深度StackType_t的类型 default uint32_t */
#define configSTACK_DEPTH_TYPE                                      uint32_t

/*消息缓冲区使用 类型 default:size_t*/
#define configMESSAGE_BUFFER_LENGTH_TYPE                            size_t

/*如果设置为 1 ，则使用 pvPortMalloc()分配的内存块 会在通过 vPortFree()释放时被清除。
 如果未定义，configHEAP_CLEAR_MEMORY_ON_FREE
 默认为 0， 以实现向后兼容。
 为提高安全性，建议将configHEAP_CLEAR_MEMORY_ON_FREE设置为 1
 defalut: 0*/
#define configHEAP_CLEAR_MEMORY_ON_FREE                             1

/* 如果 
configSUPPORT_STATIC_ALLOCATION
 设置为 1，则 RTOS 对象可以 通过应用程序编写者提供的 RAM 创建。

如果 
configSUPPORT_STATIC_ALLOCATION
 设置为 0，则 RTOS 对象 只能通过从 FreeRTOS 堆中分配的 RAM 创建。

如果 
configSUPPORT_STATIC_ALLOCATION
 未定义，则默认为 0。

如果 
configSUPPORT_STATIC_ALLOCATION
 设置为 1，则应用程序编写者还必须提供两个回调 函数：

vApplicationGetIdleTaskMemory()
，为 RTOS 空闲任务提供内存；（如果 
configUSE_TIMERS
 设置为 1）
vApplicationGetTimerTaskMemory()
，为 RTOS 守护进程/定时器服务任务提供内存。.
default 0 */
#define configSUPPORT_STATIC_ALLOCATION                             1


/* Defines 1 the kernel provided implementation of
 * vApplicationGetIdleTaskMemory() and vApplicationGetTimerTaskMemory()
 * to provide the memory that is used by the Idle task and Timer task
 * respectively. 
 * The application can provide it's own implementation of
 * vApplicationGetIdleTaskMemory() and vApplicationGetTimerTaskMemory() by
 * setting configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined. */
#define configKERNEL_PROVIDED_STATIC_MEMORY                        1

/*如果 
configSUPPORT_DYNAMIC_ALLOCATION
 设置为 1，则 RTOS 对象可通过 RAM （从 FreeRTOS 堆中自动分配）创建。

如果 
configSUPPORT_DYNAMIC_ALLOCATION
 设置为 0，则 RTOS 对象只能通过应用程序编写者提供的 RAM 创建 。

如果 
configSUPPORT_DYNAMIC_ALLOCATION
 未定义，则默认为 1。
 defalut 1*/
#define configSUPPORT_DYNAMIC_ALLOCATION                            1

/*FreeRTOS 堆中可用的 RAM 总量。

仅当 configSUPPORT_DYNAMIC_ALLOCATION 设置为 1， 
并且应用程序使用 FreeRTOS 源代码下载内容中提供的一种示例内存分配方案时，才会使用此值。
*/
#define configTOTAL_HEAP_SIZE                                       1024*10

/*默认情况下，FreeRTOS 堆由 FreeRTOS 声明， 并由链接器放置在内存中。如果将 
configAPPLICATION_ALLOCATED_HEAP
 设置为 1， 应用程序编写者可声明堆， 这意味着应用程序编写者可以将堆放置在内存中的任意位置。

如果使用 heap_1.c、heap_2.c 或 heap_4.c，并且 
configAPPLICATION_ALLOCATED_HEAP
 设置为 1，则应用程序编写者必须提供一个 
uint8_t
数组， 其名称和维度必须与下面所示完全一致。该数组将用作 FreeRTOS 堆。 如何将数组放置在特定内存位置取决于所使用的编译器， 请参阅编译器文档。

uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
default:0 */
#define configAPPLICATION_ALLOCATED_HEAP                            0


/*如果 
configSTACK_ALLOCATION_FROM_SEPARATE_HEAP
 设置为 1， 则使用 xTaskCreate 或 xTaskCreateRestricted API 创建的任务堆栈 将分别通过 
pvPortMallocStack
 和 
vPortFreeStack
 函数进行分配和释放。用户需要 提供 
pvPortMallocStack
 和 
vPortFreeStack
 函数的线程安全实现。 如此一来，用户便可以从内存的另一个区域 （可能是与 FreeRTOS 堆不同的另一个堆）为任务分配堆栈。

如果 
configSTACK_ALLOCATION_FROM_SEPARATE_HEAP
 未定义，则默认为 0*/
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP                   0

/* Hook function related definitions. */
#define configUSE_IDLE_HOOK                                 0
#define configUSE_TICK_HOOK                                 0
#define configCHECK_FOR_STACK_OVERFLOW                      0
#define configUSE_MALLOC_FAILED_HOOK                        0
#define configUSE_DAEMON_TASK_STARTUP_HOOK                  0
#define configUSE_SB_COMPLETED_CALLBACK                     0

/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS                       0
#define configUSE_TRACE_FACILITY                            0
#define configUSE_STATS_FORMATTING_FUNCTIONS                0

/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES                               0
#define configMAX_CO_ROUTINE_PRIORITIES                     1

/* Software timer related definitions. */
/*软件定时器
default:0*/
#define configUSE_TIMERS                                    1
#define configTIMER_TASK_PRIORITY                           6
#define configTIMER_QUEUE_LENGTH                            10
#define configTIMER_TASK_STACK_DEPTH                        configMINIMAL_STACK_SIZE


/************************************************************************************* */
/*中断NVIC*/
/* Interrupt nesting behaviour configuration. */
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
 /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
 #define configPRIO_BITS         __NVIC_PRIO_BITS
#else
 #define configPRIO_BITS         4
#endif
/* 最小优先级 M3 是数字越大优先级越小 0-15 15最小 0最大 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15
/* freertos 可屏蔽的最大优先级 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/*应设置为最低优先级。*/
#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
/*RTOS 内核通过将 configMAX_SYSCALL_INTRUPT_PRIORITY 的值 写入 
ARM Cortex-M BASEPRI
 寄存器来创建临界区。
因为 BASEPRI 无法屏蔽 优先级为 0 的中断（最高的优先级）， 所以不得将 configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为 0。
*/
/*configMAX_API_CALL_INTERRUPT_PRIORITY
 是 
configMAX_SYSCALL_INTERRUPT_PRIORITY
 的新名称， 仅用于新版移植。两者功能相同。*/
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_API_CALL_INTERRUPT_PRIORITY   configMAX_SYSCALL_INTERRUPT_PRIORITY

/* Define to trap errors during development. */
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}

/* FreeRTOS MPU specific definitions. */
#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0
#define configTOTAL_MPU_REGIONS                                8 /* Default value */
#define configTEX_S_C_B_FLASH                                  0x07UL /* Default value */
#define configTEX_S_C_B_SRAM                                   0x07UL /* Default value */
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY            1
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS             1
#define configENABLE_ERRATA_837070_WORKAROUND                  1

/* ARMv8-M secure side port related definitions. */
/*用于 ARMv8-M 安全端移植。

从 ARMv8-M MCU（ARM Cortex-M23、Cortex-M33 和 Cortex-M55）非安全端调用安全函数的任务有两种上下文：一种位于非安全端，另一种位于安全端。在 FreeRTOS v10.4.5 之前，ARMv8-M 安全端移植会在运行时分配引用安全端上下文的结构体。 自 FreeRTOS 10.4.5 版本开始，编译时会静态分配结构体。 
secureconfigMAX_SECURE_CONTEXTS
 可用于设置静态分配的安全上下文的数量。如果未定义，则 
secureconfigMAX_SECURE_CONTEXTS
 默认为 8。仅在 ARMv8-M 微控制器的非安全端使用 FreeRTOS 代码的应用程序 （例如在安全端运行第三方代码的应用程序）无需此常量。*/
#define secureconfigMAX_SECURE_CONTEXTS         5

/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskGetSchedulerState          1
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_uxTaskGetStackHighWaterMark     0
#define INCLUDE_uxTaskGetStackHighWaterMark2    0
#define INCLUDE_xTaskGetIdleTaskHandle          0
#define INCLUDE_eTaskGetState                   0
#define INCLUDE_xTimerPendFunctionCall          0
#define INCLUDE_xTaskAbortDelay                 0
#define INCLUDE_xTaskGetHandle                  0
#define INCLUDE_xTaskResumeFromISR              1

/* A header file that defines trace macro can be included here. */
#define  xPortPendSVHandler     PendSV_Handler
#define  xPortSysTickHandler    SysTick_Handler
#define  vPortSVCHandler        SVC_Handler

#endif /* FREERTOS_CONFIG_H */
